package actualizadorRemoto;

import java.io.IOException;
import java.net.SocketException;
import java.net.SocketTimeoutException;
import java.net.UnknownHostException;

import utiles.IDatosEquipoRemoto;
import utiles.IMensaje;
import utiles.Log;
import actualizador.Datagrama;
import actualizador.DatoEquipo;
import actualizador.Mensaje;

public class HiloRegistrarNuevosClientes extends Thread{
	private boolean continuar;
	private int nroMensaje= 0;
	private int totalMensajesPerdidos, totalMensajesRecibidos, nroMensajeEsperado= 0, ultimoMensajeRecibido;
	private String ipServidor;
	private Log log;
	private IDatosEquipoRemoto datoServidor;
	
	public HiloRegistrarNuevosClientes(String ipServidor, Log log) {
		this.ipServidor= ipServidor;
		this.log= log;
		datoServidor= new DatoEquipo(this.ipServidor);
	}
	
	public boolean isContinuar() {
		return continuar;
	}

	public void setContinuar(boolean continuar) {
		this.continuar = continuar;
	}

	@Override
	public void run() {
		int timeout= 0;
		IMensaje m, r;		
		IDatosEquipoRemoto ipc;
		log.agregarEntrada("Iniciando servidor en Ip:"+ipServidor);
		Datagrama dg= new Datagrama();
		
		while(isContinuar()){
			try {
				log.agregarEntrada("Esperando clientes...");
				m= dg.recibirMensaje(timeout);
				ipc= ((Mensaje)m).getDatosEquipoRemoto();
				log.agregarEntrada("Llego cliente: "+ipc);
				log.agregarEntrada("Mensaje recibido: "+m);
				this.registrarCliente(m);				
				r= new Mensaje(nroMensaje++, datoServidor, "Adios");
				log.agregarEntrada("Respuesta enviada: "+r+", al cliente: "+ipc);
				dg.enviarMensaje(ipc.getIp(), r);
			
			} catch (SocketTimeoutException e) {
				e.printStackTrace();
			} catch (UnknownHostException e) {
				e.printStackTrace();
			} catch (SocketException e) {
				e.printStackTrace();
			} catch (ClassNotFoundException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			} finally {
				dg.cerrarDatagrama();
			}
			
			imprimirEstadisticas();
		}
	}
	
	private void registrarCliente(IMensaje m){
		if(m.getNroMensaje() == nroMensajeEsperado){
			nroMensajeEsperado++;
		}else{
			totalMensajesPerdidos+= m.getNroMensaje()-ultimoMensajeRecibido;
			nroMensajeEsperado= m.getNroMensaje()+1;
		}
		
		ultimoMensajeRecibido= m.getNroMensaje();
		totalMensajesRecibidos++;
	}
	
	private void imprimirEstadisticas(){
		log.agregarEntrada("totalMensajesPerdidos: "+totalMensajesPerdidos+". totalMensajesRecibidos: "+totalMensajesRecibidos+
				". nroMensajeEsperado: "+nroMensajeEsperado+". ultimoMensajeRecibido: "+ultimoMensajeRecibido);
	}
	
	
}
